﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SISCON.Dao;
using SISCON.Model;
using SISCON.Common;
using log4net;
using SISCON.Vo;

namespace SISCON.Bl
{
    
    /// <summary>
    /*
    Clase la cual verifica que el usuario actual pueda 
    hacer operaciones en los salones y manda a llamar al Dao correspondiente
    */
    /// </summary>
    public class ClassroomBL
    {
        private static ILog _Logger = LogManager.GetLogger(typeof(UserBL));
        private SessionBL _SessionBL = new SessionBL();
        private ClassroomDAO _ClassroomDAO = new ClassroomDAO();
        private UserBL _UserBL = new UserBL();

        /// <summary>
        /// Verifica que el usuario actual pueda obtener una lista de todos los cursos
        /// </summary>
        /// <param name="sessionUUID">Session de usuario</param>
        /// <param name="classroomId">Id del salon</param>
        /// <returns>Lista del salon</returns>
        public List<Course> GetClassroom(string sessionUUID, string classroomId)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.CLASSROOMS);
                return _ClassroomDAO.GetClassroom(classroomId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetClassroom()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Verifica que el usuario actual te pueda obtener todas las clases que se imparten en un salon
        /// </summary>
        /// <param name="sessionUUID">Session del usuario</param>
        /// <param name="classroomId">Id del salon</param>
        /// <returns>Lista de todos los cursos que se imparten en un salon</returns>
        public List<Course> GetClassroomCourses(string sessionUUID, string classroomId)
        {
            try
            {
                long userId = _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.CLASSROOMS);
                return _ClassroomDAO.GetClassroomCourses(classroomId, userId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetClassroom()", ex);
                }
                throw ex;
            }
        }
        
        /// <summary>
        /// Verifica que el usuario pueda obtener la lista de todos los salones
        /// </summary>
        /// <param name="sessionUUID">Session del usuario</param>
        /// <returns>Lista con todo los salones</returns>
        public List<Classroom> GetAllClassrooms(string sessionUUID)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.CLASSROOMS);
                return _ClassroomDAO.GetAllClassrooms();
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetAllClassrooms()", ex);
                }
                throw ex;
            }
        }
        
        /// <summary>
        /// Verifica que el usuario pueda borrar un salon
        /// </summary>
        /// <param name="sessionUUID">Session del usuario</param>
        /// <param name="classroomId">Id del salon</param>
        public void DeleteClassroom(string sessionUUID, string classroomId)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.WRITE_ACCESS, Role.CLASSROOMS);
                _ClassroomDAO.DeleteClassroom(classroomId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in DeleteClassroom()", ex);
                }
                throw ex;
            }

        }
        
        /// <summary>
        /// Verifica que el usuario pueda guardar un nuevo salon o actualizarlo
        /// </summary>
        /// <param name="sessionUUID">Session del usuario</param>
        /// <param name="classroomId">Id del usuario</param>
        /// <param name="classroomLocation">Ubicacion del salon</param>
        /// <param name="classroomNumber">Numero del salon</param>
        public void SaveClassroom(string sessionUUID, string classroomId, string classroomLocation, string classroomNumber, string userId)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.WRITE_ACCESS, Role.CLASSROOMS);
                _ClassroomDAO.SaveClassroom(classroomId, classroomLocation,  classroomNumber, long.Parse(userId));
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in SaveClassroom()", ex);
                }
                throw ex;
            }
        }
    }
}